﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Collections.Generic;
using System.Linq;
namespace Biciq.Silverlight.UI
{
    public class EmpleadosVistaModelo:VistaModeloBase
    {
           #region campos
        private RelayCommand _comandoAbrirNuevo;
       
        private EditarEmpleadoVistaModelo _editarEmpleadoVistaModelo;
        private EditarEmpleadoVista _editarEmpleadoVista;
        private Empleado _EmpleadoActual;
        private RelayCommand _comandoEditar;
        private Empleado _EmpleadoItem;
      
        private Empleado _EmpleadoLogueado;
     
       
        private List<Empleado> _listaEmpleado;
        private String _busqueda;
        private RelayCommand _comandoBuscar;
        private bool _mostrarErrores;
        #endregion

        #region constructores
        public EmpleadosVistaModelo()
        {
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            this.EsInicio = true;
            Buscar();
        }


        #endregion

        #region metodos Publicos

        #endregion

        #region propiedades
        /// <summary>
        /// Comando que se dispara al dar click en el botón buscar
        /// </summary>
        public RelayCommand ComandoBuscar
        {
            get
            {
                if (_comandoBuscar == null)
                {
                    _comandoBuscar = new RelayCommand
                    (

                          p => Buscar()
                    );
                }
                return _comandoBuscar;
            }
        }

        /// <summary>
        /// Criterio de Búsqueda
        /// </summary>
        public string Busqueda
        {
            get { return _busqueda; }
            set
            {
                _busqueda = value;
                RaisePropertyChanged("Busqueda");
            }
        }

        /// <summary>
        /// Propiedad que muestra la lista de Empleados
        /// </summary>
        public List<Empleado> ListaEmpleado
        {
            get { return _listaEmpleado; }
            set
            {
                _listaEmpleado = value;
                RaisePropertyChanged("ListaEmpleado");
            }
        }

        /// <summary>
        /// Empleado Logueado en el Sistema
        /// </summary>
        public Empleado EmpleadoLogueado
        {
            get { return _EmpleadoLogueado; }
            set
            {
                _EmpleadoLogueado = value;
                RaisePropertyChanged("EmpleadoLogueado");
            }
        }
        
       

      
        /// <summary>
        /// Item selecionado en la grilla
        /// </summary>
        public Empleado EmpleadoItem
        {
            get { return _EmpleadoItem; }
            set { _EmpleadoItem = value; }
        }

        /// <summary>
        /// Comando para edición
        /// </summary>
        public RelayCommand ComandoEditar
        {
            get
            {
                return _comandoEditar ?? (_comandoEditar = new RelayCommand(EditarEmpleado));
            }

        }

        /// <summary>
        /// Comando para crear un nuevo item
        /// </summary>
        public RelayCommand ComandoAbrirNuevo
        {
            get
            {
                if (_comandoAbrirNuevo == null)
                {
                    _comandoAbrirNuevo = new RelayCommand
                    (
                        p => AbrirNuevo()
                    );
                }
                return _comandoAbrirNuevo;
            }
        }
        #endregion

        #region metodos Privados
        /// <summary>
        /// Realiza la Búsqueda de Empleados
        /// </summary>
        private void Buscar()
        {

            BiciqContexto.Empleados.Clear();

            var datos = BiciqContexto.Empleados;
            if (Busqueda != null && Busqueda != "")
            {
                if (!_mostrarErrores)
                {
                    InicializarMensajesError();
                }

                BiciqContexto.Load(BiciqContexto.GetBusquedaEmpleadoNombreQuery(Busqueda)).Completed += delegate
                {
                    ListaEmpleado = datos.ToList();
                    Busqueda = "";
                    validaBusqueda(ListaEmpleado);                   
                };
            }
            else
            {
                BiciqContexto.Load(BiciqContexto.GetEmpleadoesQuery()).Completed += delegate
                {
                    ListaEmpleado = datos.ToList();
                    Busqueda = "";
                    validaBusqueda(ListaEmpleado);                   
                };
            }

           
        }
      
        

        /// <summary>
        /// Método en el cual se edita el item seleccionado
        /// </summary>

        private void EditarEmpleado(object parametro)
        {
            this.EmpleadoItem = (Empleado)parametro;
            _editarEmpleadoVistaModelo = new EditarEmpleadoVistaModelo();
            _editarEmpleadoVista = new EditarEmpleadoVista();
            _editarEmpleadoVistaModelo.IsDirty = true;
            InstanciaEditarEmpleado(this.EmpleadoItem);
        }

        /// <summary>
        /// Método en el cual se crea un nuevo item
        /// </summary>
        private void AbrirNuevo()
        {
            _editarEmpleadoVistaModelo = new EditarEmpleadoVistaModelo();
            _editarEmpleadoVista = new EditarEmpleadoVista();
            InstanciaEditarEmpleado(_EmpleadoActual);
        }

        /// <summary>
        /// Para editar los Empleadoes
        /// </summary>
        /// <param name="Empleado"></param>
        private void InstanciaEditarEmpleado(Empleado Empleado)
        {
            _editarEmpleadoVista = new EditarEmpleadoVista();
            _editarEmpleadoVistaModelo = new EditarEmpleadoVistaModelo();
            if (Empleado != null)
            {
                _editarEmpleadoVistaModelo = new EditarEmpleadoVistaModelo(Empleado);
            }
            else
            {
                _editarEmpleadoVistaModelo = new EditarEmpleadoVistaModelo();
            }


            _editarEmpleadoVistaModelo.EventoCerrarEditor += delegate
            {
                _editarEmpleadoVista.Close();
                BiciqContexto.Empleados.Clear();
                _comandoBuscar = null;
                ComandoBuscar.Execute(true);

            };

            _editarEmpleadoVista.DataContext = _editarEmpleadoVistaModelo;
            _editarEmpleadoVista.HasCloseButton = false;
            _editarEmpleadoVista.Show();
        }

      
        public override void Eliminar(object parametro)
        {
            String titulo = "Eliminar Empleado";
            Action accion = EliminarEmpleado;
            this.EmpleadoItem = (Empleado)parametro;
            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar
                ("Está seguro de eliminar el Empleado seleccionado?", titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Confirmar, accion);

        }
        /// <summary>
        /// Metodo para eliminar campo Empleado.
        /// </summary>
        private void EliminarEmpleado()
        {
            InicializarMensajesError();
            Procesando = true;
            this.EmpleadoItem.estado = RecursosLenguaje.Recursos.Inactivo.ToUpper();
            BiciqContexto.Tarjetas.Clear();
            BiciqContexto.Load(BiciqContexto.GetTarjetaPorIdQuery(this.EmpleadoItem.IdTarjeta.Value)).Completed += delegate
            {
                Tarjeta tarjeta = BiciqContexto.Tarjetas.FirstOrDefault();
                if (tarjeta != null)
                {
                    tarjeta.Estado = "ELIMINADO";
                }
                BiciqContexto.SubmitChanges().Completed += delegate
                {
                    InicializarMensajesError();
                    AgregarMensajeInformacion(string.Format("El Empleado se ha eliminado con éxito"));
                    _mostrarErrores = true;
                    this.EsInicio = true;
                    Procesando = false;
                    Buscar();

                };

            };
              
            


        }

        #endregion
    }
}
